package reflex;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

public class ReflexTest {
	@Test
	public void getclass() throws ClassNotFoundException {
		// Dog类,Cat,Person，     Class的对象: 类的配方
		// new Dog(), Object的对象
		Class clazz = Cat.class;   // static静态块
		
		Dog d = new Dog();
		Class clazz2 = d.getClass();
		
		// 类的路径要给全了，包.类名    reflect(反射)
		Class clazz3 = Class.forName("reflex.Person");
		
		System.out.println(clazz.getName());
		// 得到父类类型
		Class superclass = clazz.getSuperclass();
		System.out.println(superclass.getName());
		
		// 得到父接口类型
		Class[] interfaces = clazz.getInterfaces();
		for(Class c : interfaces) {
			System.out.println(c.getName());
		}
	}
	
	@Test
	public void invoke() throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		// 1.得到类
		Class<Dog> clazz = Dog.class;
		
		// 2.创建对象
		Object dog = clazz.newInstance();   // 调用 Dog的无参构造
		
		// 3.得到add方法                                   方法名，  ...add方法的参数类型
		Method addMehtod = clazz.getMethod("add", int.class,int.class);
		
		// 4.调用方法
		Object result = addMehtod.invoke(dog, 1,2);   // dog.add(1,2)
		
		System.out.println(result);
	}

}
